﻿#define _CRT_SECURE_NO_WARNINGS 1
//my_qsort模拟实现
#include<stdio.h>
#include<stdlib.h>

//万能排序函数
void my_qsort(void* base, int num, int width, int (*compare)(const void*, const void*));
//交换函数
void swap(char* elem1, char* elem2, int width);
//比较数据类型的比较函数（回调函数）（用于测试使用，使用方自己实现）
int cmp_float(const void* elem1, const void* elem2);

int main()
{
	//创建浮点型数据数组
	float f[] = { 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 };
	//计算出数组的元素个数
	int sz = sizeof(f) / sizeof(f[0]);

	//模拟实现自己的qsort进行排序
	my_qsort(f, sz, sizeof(f[0]), cmp_float);

	//输出打印数据验证效果
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%.2f ", f[i]);
	}

	return 0;
}
//排序函数
void my_qsort(void* base, int num, int width, int (*compare)(const void*, const void*))
{
	int i = 0;
	for (i = 0; i < num - 1; i++)
	{
		int j = 0;
		for (j = 0; j < num - 1 - i; j++)
		{
			if ( (compare((char*)base + j * width, (char*)base + (j + 1) * width)) > 0 )
			{
				swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}
//交换函数，因为形参类型设计为char*，故只能一个字节一个字节的交换以达到互换数据的目的
void swap(char* elem1, char* elem2, int width)
{
	int i = 0;
	for ( i = 0; i < width; i++)
	{
		char temp = *elem1;
		*elem1 = *elem2;
		*elem2 = temp;
		elem1++;
		elem2++;
	}
}
//比较函数（用于测试使用，使用方自己实现）
int cmp_float(const void* elem1, const void* elem2)
{
	return (int)(*(float*)elem1 - *(float*)elem2);
}



